#pragma once

#include <iostream>
#include <string>
#include <cassert>
#include <pthread.h>

typedef void *(*func_t)(void *);   // 线程函数类型重定义

// 线程数据
class ThreadData
{
public:
    // 构造函数
    ThreadData(std::string& name, void *args)
        : _name(name)
        , _args(args)
    { }

    ~ThreadData() { }

    std::string _name;
    void *_args;
};

// 封装线程类
class Thread
{
public:
    // 构造函数 -- 通过指定线程函数、线程编号和线程函数参数来创建线程类
    Thread(func_t func, int num, const std::string& name, void *args)
        : _func(func)
        , _name(name + std::to_string(num))
        , _thread_data(_name, args)
    { }

    // 线程启动函数
    void start()
    {
        int n = pthread_create(&_id, nullptr, _func, (void*)&_thread_data);
        assert(n == 0);
        (void)n;
    }

    // 析构函数 -- 负责等待线程
    ~Thread()
    {
        join();
    }

private:
    // 线程等待函数
    void join()
    {
        int n = pthread_join(_id, nullptr);
        assert(n == 0);
        (void)n;
    }

    func_t _func;            // 线程函数
    std::string _name;       // 线程名称
    ThreadData _thread_data; // 线程数据(充当传递给线程函数的参数)
    pthread_t _id;           // 线程id
};